/**
 * 
 */
package IC.AST;
import IC.AST.nodes.*;

/**
 * a propogating visitor
 */
public interface PropogatingVisitor <D,U> {
    
	public U visit(Program that, D context) throws Exception;
	public U visit(ClassDecl that, D context) throws Exception;
	public U visit(MethodDecl that, D context) throws Exception;
	public U visit(FieldsDecl that, D context) throws Exception;
	
	public U visit(ArrayTypeDecl that, D context) throws Exception;
	public U visit(ClassTypeDecl that, D context) throws Exception;
	public U visit(PrimitiveTypeDecl that, D context) throws Exception;
	public U visit(FormalDecl that, D context) throws Exception;
	

	public U visit(StmtBlock that, D context) throws Exception;
	
	public U visit(WhileStmt that, D context) throws Exception;
	public U visit(BreakStmt that, D context) throws Exception;
	public U visit(ContinueStmt that, D context) throws Exception;
	public U visit(IfStmt that, D context) throws Exception;
	
	public U visit(AssignStmt that, D context) throws Exception;
	public U visit(ReturnStmt that, D context) throws Exception;
	public U visit(VarDeclStmt that, D context) throws Exception;
	
	public U visit(MethodCallStmt that, D context) throws Exception;
	public U visit(StaticCall that, D context) throws Exception;
	public U visit(VirtualCall that, D context) throws Exception;
	
	public U visit(ArrayElmVar that, D context) throws Exception;
	public U visit(SimpleVar that, D context) throws Exception;
	public U visit(MemberVar that, D context) throws Exception;
	

	
	public U visit(IntLiteral that, D context) throws Exception;
	public U visit(NullLiteral that, D context) throws Exception;
	public U visit(StringLiteral that, D context) throws Exception;
	public U visit(BoolLiteral that, D context) throws Exception;

	public U visit(BinaryExpr that, D context) throws Exception;
	public U visit(LengthExpr that, D context) throws Exception;
	public U visit(NewArrayExpr that, D context) throws Exception;
	public U visit(NewClassExpr that, D context) throws Exception;

	public U visit(ThisExpr that, D context) throws Exception;
	public U visit(UnaryExpr that, D context) throws Exception;
	
}
